﻿#include <iostream>
#include "Test.h"
#include "Point.h"

// 注: 这个函数，不是成员函数，也不是友元函数
TestClass operator%(TestClass& c1, TestClass& c2)
{
	// 不再需要直接访问Cents的私有成员
	return TestClass{ c1.getM() % c2.getM() };
}

int main()
{
	std::cout << "Hello World!\n";

	//在C++中，操作符被实现为函数。通过在操作符函数上使用函数重载，您可以定义自己的操作符版本，
	// 这些操作符用于不同的数据类型（包括您编写的类）。使用函数重载来重载运算符称为运算符重载。

   /*
   运算符重载的限制
   1, C++中几乎所有现有的操作符都可以重载。例外情况包括：条件（？：）、sizeof、域操作符（::）、成员选择器（.）、指针成员选择器（.*）、typeid和cast运算符。
   2,只能重载存在的运算符
   3,重载运算符中至少有一个操作数必须是用户定义的类型
   4,不可更改运算符支持的操作数个数
   5,所有操作符都保持其默认优先级和关联性
   */

   //有三种不同的方法来重载运算符：成员函数、友元函数和普通函数

   //友元函数实现
	TestClass tc{ 12 };
	TestClass td{ 12 };
	TestClass sum{ tc + td }; //使用重载运算符
	TestClass sum2{ tc - td }; //使用重载运算符
	TestClass sum3{ tc * td }; //使用重载运算符
	TestClass sum4{ tc / td }; //使用重载运算符
	std::cout << sum.getM() << "\n";
	std::cout << sum2.getM() << "\n";
	std::cout << sum3.getM() << "\n";
	std::cout << sum4.getM() << "\n";

	//普通函数实现运算符重载
	TestClass dd{ tc % td };
	std::cout << dd.getM() << "\n";

	//重载IO运算符
	Point p(1, 2, 3);
	std::cout << p << "\n";

	//普通函数实现运算符重载
	Point p2(p + 3);
	std::cout << p2 << "\n";

	//并非所有内容都可以作为友元函数重载
	//赋值（ = ）、下标（[]）、函数调用（（））和成员选择（->）
	//运算符必须重载为成员函数，因为语言要求它们是成员函数。








}
